package com.aididi.java8;

import java.util.function.Function;

/**
 * @Auther: zx.xu
 * @Description:    对传入的参数进行计算或转换。
 * ava.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据，前者称为前置条件，后者称为后置条件
 * 抽象方法 apply() : 根据类型T的参数获取类型R的结果。
 * 默认方法 andThen() :    用来进行组合操作，该方法同样用于“先做什么，再做什么”的场景，和 Consumer 中的 andThen 差不多
 */
public class FunctionDemo {

    //将 String 类型转换为 Integer 类型
    private static void method(Function<String, Integer> fun) {
        int num = fun.apply("10");
        System.out.println(num + 20);
    }

    //先计算10+30=40，在将40*10=400 ，最后输出时再+20=420
    private static void method(Function<String, Integer> one, Function<Integer, Integer> two) {
        int num = one.andThen(two).apply("10");
        System.out.println(num + 20);
    }

    //使用 Function 进行函数模型的拼接，按照顺序需要执行的多个函数操作
    private static int getAgeNum(String str, Function<String, String> one,
                                 Function<String, Integer> two,
                                 Function<Integer, Integer> three) {
        return one.andThen(two).andThen(three).apply(str);
    }


    public static void main(String[] args) {
        method(s -> Integer.parseInt(s));
        method(str -> Integer.parseInt(str) + 30, i -> i = i * 10);
        String str = "赵丽颖，20";
        int age = getAgeNum(str, s -> s.split("，")[1],
                s -> Integer.parseInt(s),
                n -> n += 100);
        System.out.println(age);
    }




}
